//#include<iostream>
//using namespace std;
//int main()
//{
//    int n, a, b;
//    int sum = 0;
//    cin >> n >> a >> b;
//    while (n--)
//    {
//        int x1, y1, x2, y2;
//        cin >> x1 >> y1 >> x2 >> y2;
//        if (x1 < 0 && x2 <= a && x2>0)
//        {
//            if (y1 >= 0 && y1<b && y2>b)
//            {
//                sum += abs(b - y1) * abs(x2);
//            }
//            else if (y1 >= 0 && y2 <= b)
//            {
//                sum += abs(y2 - y1) * abs(x2);
//            }
//            else if (y1 < 0 && y2>0 && y2 <= b)
//            {
//                sum += abs(x2) * abs(y2);
//            }
//        }
//        else if (x1 >= 0 && x1 <= a && x2 >= 0 && x2 <= a)
//        {
//            if (y1 >= 0 && y1 <= b && y2 > b)
//            {
//                sum += abs(b - y1) * abs(x2 - x1);
//            }
//            else if (y1 >= 0 && y2 <= b)
//            {
//                sum += abs(y2 - y1) * abs(x2 - x1);
//            }
//            else if (y1 < 0 && y2>0 && y2 <= b)
//            {
//                sum += abs(x2 - x1) * abs(y2);
//            }
//        }
//        else if (x1 >= 0 && x1<a && x2>a)
//        {
//            if (y1 >= 0 && y1 <= b && y2 > b)
//            {
//                sum += abs(b - y1) * abs(a - x1);
//            }
//            else if (y1 >= 0 && y2 <= b)
//            {
//                sum += abs(y2 - y1) * abs(a - x1);
//            }
//            else if (y1 < 0 && y2>0 && y2 <= b)
//            {
//                sum += abs(y2) * abs(a - x1);
//            }
//        }
//
//
//
//    }
//    cout << sum;
//}
//#include<iostream>
//#include<queue>
//using namespace std;
//int main()
//{
//	int n, m, k;
//	int maxi = 0;
//	int mini = 1000000000;
//	int i = 0;
//	priority_queue<pair<int, int>> t;
//	cin >> n >> m >> k;
//	int sum = 0;
//	int flag = 1;
//	for (i = 0; i < n; i++)
//	{
//		int a;
//		int b;
//		cin >> a >> b;
//		t.push(pair<int, int>(a, b));
//		if (a > maxi)
//			maxi = a;
//		if (a < mini)
//			mini = a;
//		sum += a - k;
//		if ((a - k) % b != 0)
//			flag = 0;
//	}
//	if (sum <= m && flag)
//		cout << k;
//	else
//	{
//		int sum2 = 0;
//		while (sum2 < m)
//		{
//			pair<int, int> t1 = t.top();
//			t.pop();
//			if (sum2 + t1.second >= m)
//			{
//				t.push(t1);
//				break;
//			}
//			if (t1.first - 1 >= k)
//			{
//				t1.first--;
//				t.push(t1);
//				sum2 += t1.second;
//			}
//			else
//			{
//				t.push(t1);
//				break;
//			}
//		}
//		cout << t.top().first;
//	}
//}
#include<iostream>
#include<vector>
#include<string>
#include<set>
using namespace std;
int user[1000001][501] = { 0 };
void aAndb(string s, set<int>& m, vector<int>& ui)
{
	int a1 = 0;
	int a2 = 0;
	int i = s.find(':');
	string s1(s.begin(), s.begin() + i);
	string s2(s.begin() + i + 1, s.end());
	a1 = std::stoi(s1);
	a2 = std::stoi(s2);
	i = 0;
	for (i; i < ui.size(); i++)
	{
		if (user[ui[i]][a1] == a2)
		{
			m.insert(user[ui[i]][0]);
		}
	}

}
void aNob(string s, set<int>& m, vector<int>& ui)
{
	int i = s.find('~');
	int a1 = 0;
	int a2 = 0;
	string s1(s.begin(), s.begin() + i);
	string s2(s.begin() + i + 1, s.end());
	a1 = std::stoi(s1);
	a2 = std::stoi(s2);
	i = 0;
	for (i; i < ui.size(); i++)
	{
		if (user[ui[i]][a1] != a2 && user[ui[i]][a1] != 0)
			m.insert(user[ui[i]][0]);
	}

}
int main()
{
	int n;
	vector<int> ui;
	cin >> n;
	int ct = 1;
	while (n--)
	{
		int a;
		cin >> a;
		ui.push_back(ct++);
		int k;
		cin >> k;
		user[ct - 1][0] = a;
		while (k--)
		{
			int m, n;
			cin >> m >> n;
			user[ct - 1][m] = n;
		}
	}
	int k;
	cin >> k;
	while (k--)
	{
		string s;
		cin >> s;
		if (s[0] != '&' && s[0] != '|')
		{
			int i = s.find(':');
			if (i != string::npos)
			{
				int a1 = 0;
				int a2 = 0;

				string s1(s.begin(), s.begin() + i);
				string s2(s.begin() + i + 1, s.end());
				a1 = std::stoi(s1);
				a2 = std::stoi(s2);
				i = 0;
				for (i; i < ui.size(); i++)
				{
					if (user[ui[i]][a1] == a2)
						cout << user[ui[i]][0] << ' ';
				}
				cout << endl;
			}
			else
			{
				i = s.find('~');
				int a1 = 0;
				int a2 = 0;
				string s1(s.begin(), s.begin() + i);
				string s2(s.begin() + i + 1, s.end());
				a1 = std::stoi(s1);
				a2 = std::stoi(s2);
				i = 0;
				for (i; i < ui.size(); i++)
				{
					if (user[ui[i]][a1] != a2 && user[ui[i]][a1] != 0)
						cout << user[ui[i]][0] << ' ';
				}
				cout << endl;
			}
		}
		else
		{
			int a1 = s.find('(');
			int a2 = s.find(')');
			string s1(s.begin() + a1 + 1, s.begin() + a2);
			string s2(s.begin() + a2 + 2, s.end() - 1);
			set<int> m1;
			set<int> m2;
			if (s[0] == '&')
			{
				if (s1.find(':') != string::npos)
				{
					aAndb(s1, m1, ui);
				}
				else
				{
					aNob(s1, m1, ui);
				}
				if (s2.find(':') != string::npos)
				{
					aAndb(s2, m2, ui);
				}
				else
				{
					aNob(s2, m2, ui);
				}
				vector<int> vv;
				set<int>::iterator it = m2.begin();
				while (it != m2.end())
				{
					if (m1.find(*it) != m1.end())
						vv.push_back(*it);
					it++;
				}
				int j = 0;
				for (j; j < vv.size(); j++)
				{
					cout << vv[j] << ' ';
				}
			}
			else
			{
				if (s1.find(':') != string::npos)
				{
					aAndb(s1, m1, ui);
				}
				else
				{
					aNob(s1, m1, ui);
				}
				if (s2.find(':') != string::npos)
				{
					aAndb(s2, m2, ui);
				}
				else
				{
					aNob(s2, m2, ui);
				}
				set<int>::iterator it = m2.begin();
				while (it != m2.end())
				{
					m1.insert(*it);
					it++;
				}
				set<int>::iterator it2 = m1.begin();
				while (it2 != m1.end())
				{
					cout << *it2 << ' ';
					it2++;
				}
			}
			cout << endl;
		}
	}

}